const Controller = require('egg').Controller
const jwt = require('jsonwebtoken')
const path = require('path')
const fs = require('fs')
const axios = require('axios')
const nodemailer = require('nodemailer')
const client_id =
	'305c8b4077e5026dff7d5002400521b156be74388a646fb64a1cb87eafca2e21'
const client_secret =
	'a54132f44372c39156de13c6827419b265cca92924a8cda5ded7b15ed782ae5d'
const redirect_uri = 'http://localhost:7001/api/oauth/redirect'

class MouthController extends Controller {
	// 博客 模糊搜索
	async search() {
		const { ctx } = this
		const { keywords, page = 1, size = 10 } = ctx.query
		if (keywords) {
			const data = await ctx.app.mysql.query(
				`select title, blogsId, content, createTime from blogs where title like '%${keywords}%' limit ? offset ?
`,
				[size * 1, (page - 1) * size]
			)
			ctx.body = { data }
		} else {
			ctx.body = { msg: '传参数' }
		}
	}

	// 第三方登录接口
	async auth() {
		const { ctx, app } = this
		// 1. 临时 身份id code
		const { code } = ctx.query
		console.log('code:', code)
		// 2. 拿到code去换取永久的身份id
		const response = await axios.post(
			`https://gitee.com/oauth/token?grant_type=authorization_code&code=${code}&client_id=${client_id}&redirect_uri=${redirect_uri}&client_secret=${client_secret}`
		)
		console.log(response, 'respoinse--------------------------->')
		// 3. 重定向到前端路由，请求用户的信息，发送给前端，
		const access_token = response.data.access_token
		//https://gitee.com/api/v5/user?access_token=+accessToken
		const userInfo = await axios.get(
			`https://gitee.com/api/v5/user?access_token=${access_token}`
		)
		console.log(userInfo, 'userInfo')
		ctx.response.redirect(
			`http://localhost:8080/layout?access_token=${access_token}&avatar=${userInfo.data.avatar_url}&name=${userInfo.data.name}`
		)
	}

	/**
	 * 邮件发送验证接口
	 */
	async nodeEmail() {
		const { ctx, app } = this
		// create reusable transporter object using the default SMTP transport
		let transporter = nodemailer.createTransport({
			service: 'QQ', // 发给QQ邮箱
			port: 465, // 发邮箱的端口号
			secureConnection: true, // 使用SSL加密传输 https
			auth: {
				// 1. 账号（邮箱） 2. 密码（授权码）
				// 权限认证
				user: '609432180@qq.com',
				pass: 'iqhifxasbjlgbejg' // 邮箱后台生成的授权码
			}
		})
		// send mail with defined transport object
		// 2. 配置发送邮件信息
		let mailOptions = {
			from: '609432180@qq.com', // 发邮件的账号
			to: '17610425238@163.com', // 收邮件的账号
			subject: '1904A测试邮件系统', // 标题
			html: `<html><h1>${Math.floor(Math.random() * 1000)}</h1></html>` // 邮寄的内容
		}

		transporter.sendMail(mailOptions, (err, info) => {
			console.log('info, ', info)
			if (!err) {
				console.log('邮件已经发生完成')
			} else {
				console.log(err, 'err')
				ctx.body = err
			}
		})
		ctx.body = '邮件已经发生完成'
	}

	/**
	 * oss并且分页展示
	 */
	async ossUploadPage() {
		const { ctx, app } = this
		const { page = 1, size = 10 } = ctx.query

		const data = await ctx.oss.list()
		// console.log('data:', data)

		ctx.body = {
			data: data.objects.slice((page - 1) * size, page * size),
			total: data.objects.length
		}
	}

	// oss上传接口
	async upload() {
		const { ctx, app } = this
		const file = ctx.request.files[0]
		const { imgName } = ctx.query
		console.log(file, 'file')
		const pathName = `/mouth_imgs/${Math.random()}_imgs${path.extname(
			file.filename
		)}`
		const data = await ctx.oss.put(imgName, file.filepath)
		ctx.body = { data }
	}

	async fileUpload() {
		// const data = await this.ctx.getFileStream()
		this.ctx.body = 'data'
	}

	// 博客的登陆

	async login() {
		const { ctx, app } = this
		// egg-validate
		const { email, password } = ctx.request.body

		const data = await app.mysql.get('users', { email, password })
		console.log(data, 'data---------------------data')
		const token = jwt.sign({ ...data, password: '' }, '1904A', {
			expiresIn: '1h'
		})
		if (data) {
			ctx.body = { token }
		} else {
			ctx.body = { msg: 'fail' }
		}
	}

	// 博客的列表
	async blogsList() {
		const { ctx, app } = this
		const { page = 1, size = 10 } = ctx.query
		const blogsData = await ctx.app.mysql.select('blogs', {
			limit: size * 1,
			offset: (page - 1) * size
		})
		ctx.body = { list: blogsData }
	}

	// 博客的详情 restFul
	async blogsDetail() {
		const { ctx, app } = this
		const { blogsId } = ctx.query
		const detailData = await ctx.app.mysql.get('blogs', { blogsId })
		ctx.body = { data: detailData }
	}

	// 博客的评论列表
	async blogsComments() {
		const { ctx, app } = this
		// blogsId 说明当前这个评论是属于哪个博文的；
		const { page, size, blogsId } = ctx.query

		// 1. 查询一级评论接口
		const result = await app.mysql.select('comments', {
			limit: size * 1,
			offset: (page - 1) * size,
			orders: [['commentsId', 'desc']], // 排序方式
			where: { blogsId }
		})

		// 2. 查询二级评论接口 - 处理成一级的children
		const replyData = await app.mysql.select('reply')
		console.log('replyData:', replyData)

		result.forEach((item) => {
			item.children = []
			// 判断，二级评论中，只要commentsId和一级评论的commentsId保持一致，就说嘛，这个是他的二级评论
			replyData.forEach((v) => {
				if (item.commentsId === v.commentsId) {
					item.children.push(v)
				}
			})
		})
		ctx.body = { result }
	}

	// 添加一级评论接口 （评论文章的接口）
	async addComments() {
		const { ctx, app } = this
		const { blogsId, content } = ctx.request.body
		// 从登陆信息中，拿到用户身份，（谁登陆，就是睡在评论别人）
		const userId = ctx.state.userInfo.id // 登陆者
		const insertData = await ctx.app.mysql.insert('comments', {
			sendId: userId,
			blogsId,
			content
		})
		ctx.body = { insertData }
	}

	// 添加二级评论接口 （评论回复内容的）
	async addSubComments() {
		const { ctx, app } = this
		// commentsId：在跟哪一条评论聊天（）
		// acceptId 在哪一条评论下，跟谁聊天
		// content： 聊天内容
		const { commentsId, acceptId, content } = ctx.request.body
		// 谁登陆，就是谁在聊天
		const userId = ctx.state.userInfo.id
		const insertData = await app.mysql.insert('reply', {
			commentsId,
			sendId: userId,
			acceptId,
			content
		})
		ctx.body = { insertData }
	}
}

module.exports = MouthController
